#include "XmlInfoPortail.hpp"

#include <iostream>

using namespace std;

XmlInfoPortail XmlInfoPortail::creeInstance( const QString& nomFichier,
					     const QHash< QString,
							  QString > * infos )
{
  // on récupère les strings en premier -> pas de conversion
  QString villeStr( recupereInformation( infos, "city" ) );
  QString paysStr( recupereInformation( infos, "country" ) );
  QString agAttStr( recupereInformation( infos, "attackAgency" ) );
  QString syndAttStr( recupereInformation( infos, "attackSyndicate" ) );

  // on récupère les entiers
  QString fuseauIntStr( recupereInformation( infos, "timezone" ) );
  QString verrouIntStr( recupereInformation( infos, "lockDownEnd" ) );

  // on récupère les entiers positifs
  QString defenseUintStr( recupereInformation( infos, "defense" ) );
  QString niveauUinStr( recupereInformation( infos, "level" ) );
  QString idAttUintStr( recupereInformation( infos, "attack" ) );
  QString typeAttUintStr( recupereInformation( infos, "attackKind" ) );
  QString idAgAttUintStr( recupereInformation( infos, "attackAgencyId" ) );
  QString idSyndAttUintStr( recupereInformation( infos, "attackSyndicateId" ) );
  QString nbrDefUintStr( recupereInformation( infos, "attackAttempts" ) );

  // on récupère les dates
  QString limiteDateStr( recupereInformation( infos, "attackEnd" ) );
  QString dateFormat( QString::fromUtf8( "yyyy-MM-dd hh:mm:ss" ) );

  bool conversionOK( true );
  
  XmlInfoPortail retour( XmlInfoIdentifiant::creeInstance( nomFichier, infos ),
			 villeStr, paysStr,
			 fuseauIntStr . toInt( &conversionOK ),
			 defenseUintStr . toUInt( &conversionOK ),
			 niveauUinStr . toUInt( &conversionOK ),
			 verrouIntStr . toInt( &conversionOK ),
			 idAttUintStr . toUInt( &conversionOK ),
			 static_cast< EnumTypeAttaque >( typeAttUintStr . toUInt( &conversionOK ) % 3 + 1 ),
			 QDateTime::fromString( limiteDateStr, dateFormat ),
			 agAttStr,
			 idAgAttUintStr . toUInt( &conversionOK ),
			 syndAttStr,
			 idSyndAttUintStr . toUInt( &conversionOK ),
			 nbrDefUintStr . toUInt( &conversionOK ) );

  if ( ! conversionOK )
    {
      cerr << "Impossible de lire correctement les nombres" << endl;
      return XmlInfoPortail();
    }

  return retour;							
}

/**
 * Constructeur par défaut, utilisé pour renvoyer une instance
 * invalide, n'est donc pas "public".
 */
XmlInfoPortail::XmlInfoPortail()
  : XmlInfoIdentifiant(),
    Ville( "" ),
    Pays( "" ),
    FuseauHoraire( 25 ),
    Defense( -1u ),
    Niveau( -1u ),
    FinVerouillage( 0 ),
    IdAttaque( -1u  ),
    TypeAttaque( Aucune ),
    LimiteIntervention( QDateTime() ),
    AgenceAttaquante( "" ),
    IdAgenceAttaquante( -1u ),
    SyndicatAttaquant( "" ),
    IdSyndicatAttaquant( -1u ),
    NbrDefensesRestantes( -1u )
{}

 
/**
 * Constructeur permettant de construire une instance à partir d'une
 * instance de la classe mère (XmlInfoIdentifiant) et des attributs
 * spécifique à %XmlInfoPortail. Est utilisé lors de la création d'un
 * objet avec la méthode statique creeInstance.
 *
 * @param[in] id instance de %XmlInfoIdentifiant.
 * @param[in] ville nom de la ville sur laquelle est installé le
 * portail.
 * @param[in] pays nom du pays dans lequel se trouve le portail.
 * @param[in] defense niveau de défense du portail.
 * @param[in] niveau niveau du portail (càd portée).
 * @param[in] finVerrouillage temps restant jusqu'à la réparation du
 * portail.
 * @param[in] idAttaque id de l'attaque.
 * @param[in] limiteIntervention date jusqu'à laquelle une
 * intervention est possible.
 * @param[in] agenceAttaquante nom de l'agence attaquante.
 * @param[in] idAgenceAttaquante id de l'agence attaquante.
 * @param[in] syndicatAttaquant nom du syndicat attaquant.
 * @param[in] idSyndicatAttaquant id du syndicat attaquant.
 * @param[in] nbrDefensesRestantes nombre de tentatives d'intervention
 * restantes.
 */
XmlInfoPortail::XmlInfoPortail( const XmlInfoIdentifiant& id,
				const QString& ville, const QString& pays,
				const int& fuseauHoraire,
				const unsigned& defense,
				const unsigned& niveau,
				const int& finVerouillage,
				const unsigned& idAttaque,
				const EnumTypeAttaque& typeAttaque,
				const QDateTime limiteIntervention,
				const QString& agenceAttaquante,
				const unsigned& idAgenceAttaquante,
				const QString& syndicatAttaquant,
				const unsigned& idSyndicatAttaquant,
				const unsigned& nbrDefensesRestantes )
  : XmlInfoIdentifiant( id ),
    Ville( ville ),
    Pays( pays ),
    FuseauHoraire( fuseauHoraire ),
    Defense( defense ),
    Niveau(  niveau ),
    FinVerouillage( finVerouillage ),
    IdAttaque( idAttaque  ),
    TypeAttaque( typeAttaque  ),
    LimiteIntervention( limiteIntervention ),
    AgenceAttaquante( agenceAttaquante ),
    IdAgenceAttaquante( idAgenceAttaquante ),
    SyndicatAttaquant( syndicatAttaquant ),
    IdSyndicatAttaquant( idSyndicatAttaquant ),
    NbrDefensesRestantes( nbrDefensesRestantes )
{}

/**
 * Constructeur standard, qui initialise la classe mère et les
 * attributs de l'objet.
 *
 * @param[in] nomFichier nom du fichier XML lu.
 * @param[in] id numéro d'identification de l'objet.
 * @param[in] ville nom de la ville sur laquelle est installé le
 * portail.
 * @param[in] pays nom du pays dans lequel se trouve le portail.
 * @param[in] defense niveau de défense du portail.
 * @param[in] niveau niveau du portail (càd portée).
 */
XmlInfoPortail::XmlInfoPortail( const QString& nomFichier, const unsigned& id,
				const QString& ville, const QString& pays,
				const int& fuseauHoraire,
				const unsigned& defense,
				const unsigned& niveau
				/*,
				  const int& finVerouillage,
				  const unsigned& idAttaque,
				  const EnumTypeAttaque& typeAttaque,
				  const QDateTime limiteIntervention,
				  const QString& agenceAttaquante,
				  const unsigned& idAgenceAttaquante,
				  const QString& syndicatAttaquant,
				  const unsigned& idSyndicatAttaquant,
				  const unsigned& nbrDefensesRestantes
				*/
				)
  : XmlInfoIdentifiant( nomFichier, id ), Ville( ville ), Pays( pays ),
    FuseauHoraire( fuseauHoraire ), Defense( defense ), Niveau( niveau )
{}

/**
 * Constructeur de copie, permettant de dupliquer une instance de
 * %XmlInfoPortail.
 *
 * @param[in] identifiant instance de %XmlInfoPortail à copier.
 */
XmlInfoPortail::XmlInfoPortail( const XmlInfoPortail& portail )
  : XmlInfoIdentifiant( portail ),
    Ville( portail.ville() ),
    Pays( portail.pays() ),
    FuseauHoraire( portail.fuseauHoraire() ),
    Defense( portail.defense() ),
    Niveau( portail. niveau() ),
    FinVerouillage( portail.finVerouillage() ),
    IdAttaque( portail.idAttaque()  ),
    TypeAttaque( portail.typeAttaque()  ),
    LimiteIntervention( portail.limiteIntervention()  ),
    AgenceAttaquante( portail.agenceAttaquante()  ),
    IdAgenceAttaquante( portail.idAgenceAttaquante()  ),
    SyndicatAttaquant( portail.syndicatAttaquant()  ),
    IdSyndicatAttaquant( portail.idSyndicatAttaquant()  ),
    NbrDefensesRestantes( portail.nbrDefensesRestantes()  )
{}

/**
 * Le destructeur n'au rien de particulier à faire.
 */
XmlInfoPortail::~XmlInfoPortail()
{}

/**
 * Opérateur d'affectation, permettant de copier le contenu d'une
 * instance de %XmlInfoPortail dans l'instance courante.
 *
 * @param[in] identifiant instance de %XmlInfoPortail à copier.
 *
 * @return une référence sur l'instance courante.
 */
XmlInfoPortail& XmlInfoPortail::operator=( const XmlInfoPortail& portail )
{
  if ( &portail != this )
    {
      this -> XmlInfoIdentifiant::operator=( portail );

      Ville                = portail.ville();
      Pays                 = portail.pays();
      FuseauHoraire        = portail.fuseauHoraire();
      Defense              = portail.defense();
      Niveau               = portail. niveau();
      FinVerouillage       = portail.finVerouillage();
      IdAttaque            = portail.idAttaque();
      TypeAttaque          = portail.typeAttaque();
      LimiteIntervention   = portail.limiteIntervention();
      AgenceAttaquante     = portail.agenceAttaquante();
      IdAgenceAttaquante   = portail.idAgenceAttaquante();
      SyndicatAttaquant    = portail.syndicatAttaquant();
      IdSyndicatAttaquant  = portail.idSyndicatAttaquant();
      NbrDefensesRestantes = portail.nbrDefensesRestantes();
    }

  return *this;
}

/**
 * Permet d'accéder à la ville sur laquelle le portail est installé.
 *
 * @return une référence constante sur Ville.
 */
const QString& XmlInfoPortail::ville() const
{
  return Ville;
}

/**
 * Permet d'accéder au pays dans lequel le portail se trouve.
 *
 * @return une référence constante sur Pays.
 */
const QString& XmlInfoPortail::pays() const
{
  return Pays;
}

/**
 * Permet d'accéder au fuseau horaire dans lequel le portail se
 * trouve.
 *
 * @return une référence constante sur FuseauHoraire.
 */
const int& XmlInfoPortail::fuseauHoraire() const
{
  return FuseauHoraire;
}

/**
 * Permet d'accéder au nivea de défense du portail.
 *
 * @return une référence constante sur Defense.
 */
const unsigned& XmlInfoPortail::defense() const
{
  return Defense;
}

/**
 * Permet d'accéder au niveau du portail (càd sa portée).
 *
 * @return une référence constante sur Niveau;
 */
const unsigned& XmlInfoPortail::niveau() const
{
  return Niveau;
}

/**
 * Permet d'accéder au nombre de secondes jusqu'à la réparation du
 * portail.
 *
 * @return une référence constante sur FinVerouillage.
 */
const int& XmlInfoPortail::finVerouillage() const
{
  return FinVerouillage;
}

/**
 * Permet d'accéder à l'id de l'attaque en cours.
 *
 * @return une référence constante sur IdAttaque.
 */
const unsigned& XmlInfoPortail::idAttaque() const
{
  return IdAttaque;
}

/**
 * Permet d'accéder au type de l'attaque en cours.
 *
 * @return une référence constante sur TypeAttaque.
 */
const EnumTypeAttaque& XmlInfoPortail::typeAttaque() const
{
  return TypeAttaque;
}

/**
 * Permet d'accéder à la date de la dernière intervention possible.
 *
 * @return une référence constante sur LimiteIntervention.
 */
const QDateTime& XmlInfoPortail::limiteIntervention() const
{
  return LimiteIntervention;
}

/**
 * Permet d'accéder au nom de l'agence attaquante.
 *
 * @return une référence constante sur AgenceAttaquante.
 */
const QString& XmlInfoPortail::agenceAttaquante() const
{
  return AgenceAttaquante;
}

/**
 * Permet d'accéder à l'id de l'agence attaquante.
 *
 * @return une référence constante sur IdAgenceAttaquante.
 */
const unsigned& XmlInfoPortail::idAgenceAttaquante() const
{
  return IdAgenceAttaquante;
}

/**
 * Permet d'accéder au nom du syndicat attaquant.
 *
 * @return une référence constante sur SyndicatAttaquant.
 */
const QString& XmlInfoPortail::syndicatAttaquant() const
{
  return SyndicatAttaquant;
}

/**
 * Permet d'accéder $ l'id du syndicat attaquant.
 *
 * @return une référence constante sur IdSyndicatAttaquant.
 */
const unsigned& XmlInfoPortail::idSyndicatAttaquant() const
{
  return IdSyndicatAttaquant;
}

/**
 * Permet d'accéder au nombre de tentatives de défense restantes.
 *
 * @return une référence constante sur NbrDefensesRestantes.
 */
const unsigned& XmlInfoPortail::nbrDefensesRestantes() const
{
  return NbrDefensesRestantes;
}

/**
 * Permet de changer le nom de la ville sur laquelle le portail est
 * installé.
 *
 * @param[in] ville nouvelle valeur de Ville.
 */
void XmlInfoPortail::setVille( const QString& ville )
{
  Ville = ville;
}

/**
 * Permet de changer le nom du pays dans lequel est le portail.
 *
 * @param[in] pays nouvelle valeur de Pays.
 */
void XmlInfoPortail::setPays( const QString& pays )
{
  Pays = pays;
}

/**
 * Permet de changer le fuseau horaire du portail.
 *
 * @param[in] fuseauHoraire nouvelle valeur de FuseauHoraire.
 */
void XmlInfoPortail::setFuseauHoraire( const int& fuseauHoraire )
{
  FuseauHoraire = fuseauHoraire;
}

/**
 * Permet de changer la valeur de défense du portail.
 *
 * @param[in] defense nouvelle valeur de Defense.
 */
void XmlInfoPortail::setDefense( const unsigned& defense )
{
  Defense = defense;
}

/**
 * Permet de changer la valeur du niveau du portail.
 *
 * @param[in] niveau nouvelle valeur de Niveau.
 */
void XmlInfoPortail::setNiveau( const unsigned& niveau )
{
  Niveau = niveau;
}

/**
 * Permet de changer la date de fin de réparation du portail.
 *
 * @param[in] finVerrouillage nouvelle valeur de FinVerouillage.
 */
void XmlInfoPortail::setFinVerouillage( const int& finVerouillage )
{
  FinVerouillage = finVerouillage;
}

/**
 * Permet de changer la valeur de l'id de l'attaque.
 *
 * @param[in] idAttaque nouvelle valeur de IdAttaque.
 */
void XmlInfoPortail::setIdAttaque( const unsigned& idAttaque )
{
  IdAttaque = idAttaque;
}

/**
 * Permet de changer le type d'attaque.
 *
 * @param[in] typeAttaque nouvelle valeur de TypeAttaque.
 */
void XmlInfoPortail::setTypeAttaque( const EnumTypeAttaque& typeAttaque )
{
  TypeAttaque = typeAttaque;
}

/**
 * Permet de changer la date de la dernière intervention possible.
 *
 * @param[in] limiteIntervention nouvelle valeur de
 * LimiteIntervention.
 */
void XmlInfoPortail::setLimiteIntervention( const QDateTime& limiteIntervention )
{
  LimiteIntervention = limiteIntervention;
}

/**
 * Permet de changer le nom de l'agence attaquante.
 *
 * @param[in] agenceAttaquante nouvelle valeur de AgenceAttaquante.
 */
void XmlInfoPortail::setAgenceAttaquante( const QString& agenceAttaquante )
{
  AgenceAttaquante = agenceAttaquante;
}

/**
 * Permet de changer l'id de l'agence attaquante.
 *
 * @param[in] idAgenceAttaquante nouvelle valeur de
 * IdAgenceAttaquante.
 */
void XmlInfoPortail::setIdAgenceAttaquante( const unsigned& idAgenceAttaquante )
{
  IdAgenceAttaquante = idAgenceAttaquante;
}

/**
 * Permet de changer le nom du syndicat attaquant.
 *
 * @param[in] syndicatAttaquant nouvelle valeur de SyndicatAttaquant.
 */
void XmlInfoPortail::setSyndicatAttaquant( const QString& syndicatAttaquant )
{
  SyndicatAttaquant = syndicatAttaquant;
}

/**
 * Permet de changer l'id du syndicat attaquant.
 *
 * @param[in] idSyndicatAttaquant nouvelle valeur de
 * IdSyndicatAttaquant.
 */
void XmlInfoPortail::setIdSyndicatAttaquant( const unsigned& idSyndicatAttaquant )
{
  IdSyndicatAttaquant = idSyndicatAttaquant;
}

/**
 * Permet de changer le nombre de tentatives de défense restantes.
 *
 * @param[in] nbrDefensesRestantes nouvelle valeur de
 * NbrDefensesRestantes.
 */
void XmlInfoPortail::setNbrDefensesRestantes( const unsigned& nbrDefensesRestantes )
{
  NbrDefensesRestantes = nbrDefensesRestantes;
}

